package cn.st4rlight.util.enums;

import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.function.ToIntFunction;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;

/**
 * @author st4rlight <st4rlight@163.com>
 * Created on 2025-09-08
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class EnumUtil {

    /**
     * 通用方法: 根据枚举的code值构建不可变映射
     * @param enumClass 枚举类
     * @param codeGetter 获取枚举code值的方法引用
     * @return 不可变的Map，key为枚举的code值，value为枚举实例
     * @param <E> 枚举类型
     */
    public static <E extends Enum<E>>Map<Integer, E> buildCodeCache(Class<E> enumClass, ToIntFunction<E> codeGetter) {
        Map<Integer, E> tempMap = Maps.newHashMap();
        for (E enumValue : enumClass.getEnumConstants()) {
            tempMap.put(codeGetter.applyAsInt(enumValue), enumValue);
        }
        return ImmutableMap.copyOf(tempMap);
    }

    /**
     * 通用方法: 根据枚举的key值构建不可变映射
     * @param enumClass 枚举类
     * @return 不可变Map，key为枚举的key，value为枚举实例
     * @param <E> 枚举类型
     */
    public static <E extends Enum<E>> Map<String, E> buildKeyCache(Class<E> enumClass, Function<E, String> keyGetter) {
        Map<String, E> tempMap = Maps.newHashMap();
        for (E enumValue : enumClass.getEnumConstants()) {
            tempMap.put(keyGetter.apply(enumValue), enumValue);
        }
        return ImmutableMap.copyOf(tempMap);
    }

    /**
     * 构建所有Enum.name()的集合
     * @param enumClass 枚举类
     * @return 不可变Set, 元素为枚举名
     * @param <E> 枚举类型
     */
    public static <E extends Enum<E>> Set<String> buildNameSet(Class<E> enumClass) {
        Set<String> tempSet = Sets.newHashSet();
        for (E enumValue : enumClass.getEnumConstants()) {
            tempSet.add(enumValue.name());
        }
        return ImmutableSet.copyOf(tempSet);
    }
}
